// Netcat1 is a read-only TCP client.
package main

import (
	"fmt"
	"io"
	"log"
	"net"
	"os"
)

func main() {

	ports := os.Args[1:]
	if len(ports) == 0 {
		log.Panic("最少需要传入一个端口")
	}

	for _, port := range ports {
		client(port)
	}

}

func client(port string) {
	conn, err := net.Dial("tcp", fmt.Sprintf("localhost:%s", port))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	printData(conn, port)
}

func printData(src io.Reader, port string) {
	d := &data{
		port: port,
	}
	if _, err := io.Copy(d, src); err != nil {
		log.Fatal(err)
	}
}

// data 类型
type data struct {
	port string
	data string
}

// 输出*data的时候，直接输出解引用data的值
func (d *data) String() string {
	return fmt.Sprintf("port:%s: %s \n", d.port, d.data)
}

// 实现Writer接口, 用于将数据写入到data类型的指针中
func (d *data) Write(p []byte) (n int, err error) {
	// 写入数据
	d.data = string(p)
	//fmt.Println(d)
	return len(p), nil
}
